<!DOCTYPE html>



  


<html class="theme-next gemini use-motion" lang="zh-CN">
<head>
  <meta charset="UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=2"/>
<meta name="theme-color" content="#222">












<meta http-equiv="Cache-Control" content="no-transform" />
<meta http-equiv="Cache-Control" content="no-siteapp" />






















<link href="/lib/font-awesome/css/font-awesome.min.css?v=4.6.2" rel="stylesheet" type="text/css" />

<link href="/css/main.css?v=6.0.6" rel="stylesheet" type="text/css" />


  <link rel="apple-touch-icon" sizes="180x180" href="/images/apple-touch-icon-next.png?v=6.0.6">


  <link rel="icon" type="image/png" sizes="32x32" href="/images/favicon-32x32-next.png?v=6.0.6">


  <link rel="icon" type="image/png" sizes="16x16" href="/images/favicon-16x16-next.png?v=6.0.6">


  <link rel="mask-icon" href="/images/logo.svg?v=6.0.6" color="#222">









<script type="text/javascript" id="hexo.configurations">
  var NexT = window.NexT || {};
  var CONFIG = {
    root: '/',
    scheme: 'Gemini',
    version: '6.0.6',
    sidebar: {"position":"left","display":"post","offset":12,"b2t":false,"scrollpercent":false,"onmobile":false},
    fancybox: false,
    fastclick: false,
    lazyload: false,
    tabs: true,
    motion: {"enable":true,"async":false,"transition":{"post_block":"fadeIn","post_header":"slideDownIn","post_body":"slideDownIn","coll_header":"slideLeftIn","sidebar":"slideUpIn"}},
    algolia: {
      applicationID: '',
      apiKey: '',
      indexName: '',
      hits: {"per_page":10},
      labels: {"input_placeholder":"Search for Posts","hits_empty":"We didn't find any results for the search: ${query}","hits_stats":"${hits} results found in ${time} ms"}
    }
  };
</script>


  




  

<meta name="description" content="概述 匹配单个字符 匹配一组字符 使用元字符 匹配空白字符 匹配特定的字符类别 使用 POSIX 字符类   重复匹配 位置匹配 单词边界 字符串边界   使用子表达式 回溯引用 替换 大小写转换   前后查找 嵌入条件 回溯引用条件 前后查找条件     概述正则表达式用于文本内容的查找和替换。 正则表达式内置于其它语言或者软件产品中，它本身不是一种语言或者软件。 一个问题往往可以用多种正则">
<meta name="keywords" content="正则">
<meta property="og:type" content="article">
<meta property="og:title" content="正则表达式（转）">
<meta property="og:url" content="http://7ht.gitee.io/2018/03/16/正则表达式（转）/index.html">
<meta property="og:site_name" content="HonTu&#39;s Notes">
<meta property="og:description" content="概述 匹配单个字符 匹配一组字符 使用元字符 匹配空白字符 匹配特定的字符类别 使用 POSIX 字符类   重复匹配 位置匹配 单词边界 字符串边界   使用子表达式 回溯引用 替换 大小写转换   前后查找 嵌入条件 回溯引用条件 前后查找条件     概述正则表达式用于文本内容的查找和替换。 正则表达式内置于其它语言或者软件产品中，它本身不是一种语言或者软件。 一个问题往往可以用多种正则">
<meta property="og:locale" content="zh-CN">
<meta property="og:updated_time" content="2018-03-28T03:27:24.946Z">
<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="正则表达式（转）">
<meta name="twitter:description" content="概述 匹配单个字符 匹配一组字符 使用元字符 匹配空白字符 匹配特定的字符类别 使用 POSIX 字符类   重复匹配 位置匹配 单词边界 字符串边界   使用子表达式 回溯引用 替换 大小写转换   前后查找 嵌入条件 回溯引用条件 前后查找条件     概述正则表达式用于文本内容的查找和替换。 正则表达式内置于其它语言或者软件产品中，它本身不是一种语言或者软件。 一个问题往往可以用多种正则">






  <link rel="canonical" href="http://7ht.gitee.io/2018/03/16/正则表达式（转）/"/>



<script type="text/javascript" id="page.configurations">
  CONFIG.page = {
    sidebar: "",
  };
</script>

  <title>正则表达式（转） | HonTu's Notes</title>
  









  <noscript>
  <style type="text/css">
    .use-motion .motion-element,
    .use-motion .brand,
    .use-motion .menu-item,
    .sidebar-inner,
    .use-motion .post-block,
    .use-motion .pagination,
    .use-motion .comments,
    .use-motion .post-header,
    .use-motion .post-body,
    .use-motion .collection-title { opacity: initial; }

    .use-motion .logo,
    .use-motion .site-title,
    .use-motion .site-subtitle {
      opacity: initial;
      top: initial;
    }

    .use-motion {
      .logo-line-before i { left: initial; }
      .logo-line-after i { right: initial; }
    }
  </style>
</noscript>

</head>

<body itemscope itemtype="http://schema.org/WebPage" lang="zh-CN">

  
  
    
  

  <div class="container sidebar-position-left page-post-detail">
    <div class="headband"></div>

    <header id="header" class="header" itemscope itemtype="http://schema.org/WPHeader">
      <div class="header-inner"> 

<div class="site-brand-wrapper">
  <div class="site-meta ">
    

    <div class="custom-logo-site-title">
      <a href="/" class="brand" rel="start">
        <span class="logo-line-before"><i></i></span>
        <span class="site-title">HonTu's Notes</span>
        <span class="logo-line-after"><i></i></span>
      </a>
    </div>
      
        <p class="site-subtitle">一小瓶</p>
      
  </div>

  <div class="site-nav-toggle">
    <button aria-label="切换导航栏">
      <span class="btn-bar"></span>
      <span class="btn-bar"></span>
      <span class="btn-bar"></span>
    </button>
  </div>
</div>

<nav class="site-nav">
  

  
    <ul id="menu" class="menu">
      
        
        
          
  <li class="menu-item menu-item-home">
    <a href="/" rel="section">
      <i class="menu-item-icon fa fa-fw fa-home"></i> <br />首页</a>
</li>

      
        
        
          
  <li class="menu-item menu-item-about">
    <a href="/about/" rel="section">
      <i class="menu-item-icon fa fa-fw fa-user"></i> <br />关于</a>
</li>

      
        
        
          
  <li class="menu-item menu-item-tags">
    <a href="/tags/" rel="section">
      <i class="menu-item-icon fa fa-fw fa-tags"></i> <br />标签</a>
</li>

      
        
        
          
  <li class="menu-item menu-item-categories">
    <a href="/categories/" rel="section">
      <i class="menu-item-icon fa fa-fw fa-th"></i> <br />分类</a>
</li>

      

      
    </ul>
  

  

  
</nav>


  



 </div>
    </header>

    


    <main id="main" class="main">
      <div class="main-inner">
        <div class="content-wrap">
          
            

          
          <div id="content" class="content">
            

  <div id="posts" class="posts-expand">
    

  

  
  
  

  

  <article class="post post-type-normal" itemscope itemtype="http://schema.org/Article">
  
  
  
  <div class="post-block">
    <link itemprop="mainEntityOfPage" href="http://7ht.gitee.io/2018/03/16/正则表达式（转）/">

    <span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
      <meta itemprop="name" content="Q.hongtao">
      <meta itemprop="description" content="">
      <meta itemprop="image" content="/images/head_cat.jpg">
    </span>

    <span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
      <meta itemprop="name" content="HonTu's Notes">
    </span>

    
      <header class="post-header">

        
        
          <h1 class="post-title" itemprop="name headline">正则表达式（转）</h1>
        

        <div class="post-meta">
          <span class="post-time">
            
              <span class="post-meta-item-icon">
                <i class="fa fa-calendar-o"></i>
              </span>
              
                <span class="post-meta-item-text">发表于</span>
              
              <time title="创建于" itemprop="dateCreated datePublished" datetime="2018-03-16T18:58:20+08:00">2018-03-16</time>
            

            
            

            
          </span>

          
            <span class="post-category" >
            
              <span class="post-meta-divider">|</span>
            
              <span class="post-meta-item-icon">
                <i class="fa fa-folder-o"></i>
              </span>
              
                <span class="post-meta-item-text">分类于</span>
              
              
                <span itemprop="about" itemscope itemtype="http://schema.org/Thing"><a href="/categories/基础知识/" itemprop="url" rel="index"><span itemprop="name">基础知识</span></a></span>

                
                
              
            </span>
          

          
            
          

          
          

          
            <span class="post-meta-divider">|</span>
            <span class="post-meta-item-icon"
            >
            <i class="fa fa-eye"></i>
             阅读次数： 
            <span class="busuanzi-value" id="busuanzi_value_page_pv" ></span>
            </span>
          

          

          

        </div>
      </header>
    

    
    
    
    <div class="post-body" itemprop="articleBody">

      
      

      
        <!-- GFM-TOC -->
<ul>
<li><a href="#概述">概述</a></li>
<li><a href="#匹配单个字符">匹配单个字符</a></li>
<li><a href="#匹配一组字符">匹配一组字符</a></li>
<li><a href="#使用元字符">使用元字符</a><ul>
<li><a href="#匹配空白字符">匹配空白字符</a></li>
<li><a href="#匹配特定的字符类别">匹配特定的字符类别</a></li>
<li><a href="#使用-posix-字符类">使用 POSIX 字符类</a></li>
</ul>
</li>
<li><a href="#重复匹配">重复匹配</a></li>
<li><a href="#位置匹配">位置匹配</a><ul>
<li><a href="#单词边界">单词边界</a></li>
<li><a href="#字符串边界">字符串边界</a></li>
</ul>
</li>
<li><a href="#使用子表达式">使用子表达式</a></li>
<li><a href="#回溯引用">回溯引用</a><ul>
<li><a href="#替换">替换</a></li>
<li><a href="#大小写转换">大小写转换</a></li>
</ul>
</li>
<li><a href="#前后查找">前后查找</a></li>
<li><a href="#嵌入条件">嵌入条件</a><ul>
<li><a href="#回溯引用条件">回溯引用条件</a></li>
<li><a href="#前后查找条件">前后查找条件</a><!-- GFM-TOC -->
</li>
</ul>
</li>
</ul>
<h1 id="概述"><a href="#概述" class="headerlink" title="概述"></a>概述</h1><p>正则表达式用于文本内容的查找和替换。</p>
<p>正则表达式内置于其它语言或者软件产品中，它本身不是一种语言或者软件。</p>
<p>一个问题往往可以用多种正则表达式方案来解决。</p>
<p><a href="http://tool.chinaz.com/regex" target="_blank" rel="noopener">正则表达式在线工具</a></p>
<h1 id="匹配单个字符"><a href="#匹配单个字符" class="headerlink" title="匹配单个字符"></a>匹配单个字符</h1><p>正则表达式一般是区分大小写的，但是也有些实现是不区分。</p>
<p><strong>.</strong>  可以用来匹配任何的单个字符，但是在绝大多数实现里面，不能匹配换行符；</p>
<p><strong>\</strong>  是元字符，表示它有特殊的含义，而不是字符本身的含义。如果需要匹配 . ，那么要用 \ 进行转义，即在 . 前面加上 \ 。</p>
<p><strong>正则表达式</strong></p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">nam.</span><br></pre></td></tr></table></figure>
<p><strong>匹配结果</strong></p>
<p>My  <strong>name</strong>  is Zheng.</p>
<h1 id="匹配一组字符"><a href="#匹配一组字符" class="headerlink" title="匹配一组字符"></a>匹配一组字符</h1><p><strong>[ ]</strong>  定义一个字符集合；</p>
<p>0-9、a-z 定义了一个字符区间，区间使用 ASCII 码来确定。字符区间只能用在 [ ] 之间，因此  <strong>-</strong>  元字符只有在 [ ] 之间才是元字符，在 [ ] 之外就是一个普通字符；</p>
<p><strong>^</strong>  是取非操作，必须在 [ ] 字符集合中使用；</p>
<p><strong>应用</strong></p>
<p>匹配以 abc 为开头，并且最后一个字母不为数字的字符串：</p>
<p><strong>正则表达式</strong></p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">abc[^0-9]</span><br></pre></td></tr></table></figure>
<p><strong>匹配结果</strong></p>
<ol>
<li><strong>abcd</strong></li>
<li>abc1</li>
<li>abc2</li>
</ol>
<h1 id="使用元字符"><a href="#使用元字符" class="headerlink" title="使用元字符"></a>使用元字符</h1><h2 id="匹配空白字符"><a href="#匹配空白字符" class="headerlink" title="匹配空白字符"></a>匹配空白字符</h2><table>
<thead>
<tr>
<th>元字符</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>[\b]</td>
<td>回退（删除）一个字符</td>
</tr>
<tr>
<td>\f</td>
<td>换页符</td>
</tr>
<tr>
<td>\n</td>
<td>换行符</td>
</tr>
<tr>
<td>\r</td>
<td>回车符</td>
</tr>
<tr>
<td>\t</td>
<td>制表符</td>
</tr>
<tr>
<td>\v</td>
<td>垂直制表符</td>
</tr>
</tbody>
</table>
<p>\r\n 是 Windows 中的文本行结束标签，在 Unix/Linux 则是 \n ；\r\n\r\n 可以匹配 Windows 下的空白行，因为它将匹配两个连续的行尾标签，而这正是两条记录之间的空白行；</p>
<p>. 是元字符，前提是没有对它们进行转义； f 和 n 也是元字符，但是前提是对他们进行了转义。</p>
<h2 id="匹配特定的字符类别"><a href="#匹配特定的字符类别" class="headerlink" title="匹配特定的字符类别"></a>匹配特定的字符类别</h2><p><strong>1. 数字元字符</strong></p>
<table>
<thead>
<tr>
<th>元字符</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>\d</td>
<td>数字字符，等价于 [0-9]</td>
</tr>
<tr>
<td>\D</td>
<td>非数字字符，等价于 [^0-9]</td>
</tr>
</tbody>
</table>
<p><strong>2. 字母数字元字符</strong></p>
<table>
<thead>
<tr>
<th>元字符</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>\w</td>
<td>大小写字母，下划线和数字，等价于 [a-zA-Z0-9_]</td>
</tr>
<tr>
<td>\W</td>
<td>对 \w 取非</td>
</tr>
</tbody>
</table>
<p><strong>3. 空白字符元字符</strong></p>
<table>
<thead>
<tr>
<th>元字符</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>\s</td>
<td>任何一个空白字符，等价于 [\f\n\r\t\v]</td>
</tr>
<tr>
<td>\S</td>
<td>对 \s 取非</td>
</tr>
</tbody>
</table>
<p>\x 匹配十六进制字符，\0 匹配八进制，例如 \x0A 对应 ASCII 字符 10 ，等价于 \n，也就是它会匹配 \n 。</p>
<h2 id="使用-POSIX-字符类"><a href="#使用-POSIX-字符类" class="headerlink" title="使用 POSIX 字符类"></a>使用 POSIX 字符类</h2><table>
<thead>
<tr>
<th>字符类</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>[:alnum:]</td>
<td>字母数字字符</td>
</tr>
<tr>
<td>[:alpha:]</td>
<td>字母字符</td>
</tr>
<tr>
<td>[:cntrl:]</td>
<td>控制字符</td>
</tr>
<tr>
<td>[:digit:]</td>
<td>数字字符</td>
</tr>
<tr>
<td>[:graph:]</td>
<td>非空白字符 ( 非空格、控制字符等 )</td>
</tr>
<tr>
<td>[:lower:]</td>
<td>小写字母</td>
</tr>
<tr>
<td>[:print:]</td>
<td>与 [:graph:] 相似，但是包含空格字符</td>
</tr>
<tr>
<td>[:punct:]</td>
<td>标点字符</td>
</tr>
<tr>
<td>[:space:]</td>
<td>所有的空白字符 ( 换行符、空格、制表符 )</td>
</tr>
<tr>
<td>[:upper:]</td>
<td>大写字母</td>
</tr>
<tr>
<td>[:xdigit:]</td>
<td>允许十六进制的数字 (0-9a-fA-F)</td>
</tr>
</tbody>
</table>
<p>并不是所有正则表达式实现都支持 POSIX 字符类，也不一定使用它。</p>
<p>使用时需要用两对方括号，例如 [[:alpha:]]。</p>
<h1 id="重复匹配"><a href="#重复匹配" class="headerlink" title="重复匹配"></a>重复匹配</h1><p><strong>+</strong>  匹配 1 个或者多个字符， <strong>*</strong> 匹配 0 个或者多个，<strong>?</strong> 匹配 0 个或者 1 个。</p>
<p><strong>应用</strong></p>
<p>匹配邮箱地址。</p>
<p><strong>正则表达式</strong></p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">[\w.]+@\w+.\w+</span><br></pre></td></tr></table></figure>
<p>[\w.] 匹配的是字母数字或者 . ，在其后面加上 + ，表示匹配多次。在字符集合 [ ] 里，. 不是元字符；</p>
<p><strong>匹配结果</strong></p>
<p><strong>abc.def<span>@</span>qq.com</strong></p>
<p>为了可读性，常常把转义的字符放到字符集合 [ ] 中，但是含义是相同的。</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">\w+@\w+.\w+</span><br><span class="line">[\w]+@[\w]+.[\w]+</span><br></pre></td></tr></table></figure>
<p><strong>{n}</strong>  匹配 n 个字符，<strong>{m, n}</strong> 匹配 m~n 个字符，<strong>{m,}</strong> 至少匹配 m 个字符；</p>
<p>* 和 + 都是贪婪型元字符，会匹配最多的内容，在元字符后面加 ? 可以转换为懒惰型元字符，例如 *?、+? 和 {m, n}? 。</p>
<p><strong>正则表达式</strong></p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">a.+c</span><br></pre></td></tr></table></figure>
<p>由于 + 是贪婪型的，因此 .+ 会匹配更可能多的内容，所以会把整个 abcabcabc 文本都匹配，而不是只匹配前面的 abc 文本。用懒惰型可以实现匹配前面的。</p>
<p><strong>匹配结果</strong></p>
<p><strong>abcabcabc</strong></p>
<h1 id="位置匹配"><a href="#位置匹配" class="headerlink" title="位置匹配"></a>位置匹配</h1><h2 id="单词边界"><a href="#单词边界" class="headerlink" title="单词边界"></a>单词边界</h2><p><strong>\b</strong>  可以匹配一个单词的边界，边界是指位于 \w 和 \W 之间的位置；<strong>\B</strong> 匹配一个不是单词边界的位置。</p>
<p>\b 只匹配位置，不匹配字符，因此 \babc\b 匹配出来的结果为 3 个字符。</p>
<h2 id="字符串边界"><a href="#字符串边界" class="headerlink" title="字符串边界"></a>字符串边界</h2><p><strong>^</strong>  匹配整个字符串的开头，<strong>$</strong> 匹配结尾。</p>
<p>^ 元字符在字符集合中用作求非，在字符集合外用作匹配字符串的开头。</p>
<p>使用 (?m) 来打开分行匹配模式，在该模式下，换行被当做字符串的边界。</p>
<p><strong>应用</strong></p>
<p>匹配代码中以 // 开始的注释行</p>
<p><strong>正则表达式</strong></p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">(?m)^\s*//.*$</span><br></pre></td></tr></table></figure>
<p>如果没用 (?m)，则只会匹配 // 注释 1 以及之后的所有内容，因为 * 是贪婪型的。用了分行匹配模式之后，换行符被当成是字符串分隔符，因此能正确匹配出两个注释内容。</p>
<p><strong>匹配结果</strong></p>
<ol>
<li>public void fun() {</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;     <strong>// 注释 1</strong></li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;    int a = 1;</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;    int b = 2;</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;     <strong>// 注释 2</strong></li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;    int c = a + b;</li>
<li>}</li>
</ol>
<h1 id="使用子表达式"><a href="#使用子表达式" class="headerlink" title="使用子表达式"></a>使用子表达式</h1><p>使用  <strong>( )</strong>  定义一个子表达式。子表达式的内容可以当成一个独立元素，即可以将它看成一个字符，并且使用 * 等元字符。</p>
<p>子表达式可以嵌套，但是嵌套层次过深会变得很难理解。</p>
<p><strong>正则表达式</strong></p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">(ab) &#123;2,&#125;</span><br></pre></td></tr></table></figure>
<p><strong>匹配结果</strong></p>
<p><strong>ababab</strong></p>
<p><strong>|</strong>  是或元字符，它把左边和右边所有的部分都看成单独的两个部分，两个部分只要有一个匹配就行。</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">(19|20)\d&#123;2&#125;</span><br></pre></td></tr></table></figure>
<p><strong>匹配结果</strong></p>
<ol>
<li><strong>1900</strong></li>
<li><strong>2010</strong></li>
<li>1020</li>
</ol>
<p><strong>应用</strong></p>
<p>匹配 IP 地址。IP 地址中每部分都是 0-255 的数字，用正则表达式匹配时以下情况是合法的：</p>
<ol>
<li>一位或者两位的数字</li>
<li>1 开头的三位数</li>
<li>2 开头，第 2 位是 0-4 的三位数</li>
<li>25 开头，第 3 位是 0-5 的三位数</li>
</ol>
<p><strong>正则表达式</strong></p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">(((\d&#123;1,2&#125;)|(1\d&#123;2&#125;)|(2[0-4]\d)|(25[0-5]))\.) &#123;3&#125;(((\d&#123;1,2&#125;)|(1\d&#123;2&#125;)|(2[0-4]\d)|(25[0-5])))</span><br></pre></td></tr></table></figure>
<p><strong>匹配结果</strong></p>
<ol>
<li><strong>192.168.0.1</strong></li>
<li>555.555.555.555</li>
</ol>
<h1 id="回溯引用"><a href="#回溯引用" class="headerlink" title="回溯引用"></a>回溯引用</h1><p>回溯引用使用  <strong>\n</strong>  来引用某个子表达式，其中 n 代表的是子表达式的序号，从 1 开始。它和子表达式匹配的内容一致，比如子表达式匹配到 abc ，那么回溯引用部分也需要匹配 abc 。</p>
<p><strong>应用</strong></p>
<p>匹配 HTML 中合法的标题元素。</p>
<p><strong>正则表达式</strong></p>
<p>\1 将回溯引用子表达式 (h[1-6]) 匹配的内容，也就是说必须和子表达式匹配的内容一致。</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">&lt;(h[1-6])&gt;\w*?&lt;/\1&gt;</span><br></pre></td></tr></table></figure>
<p><strong>匹配结果</strong></p>
<ol>
<li><strong>&lt;h1&gt;x&lt;/h1&gt;</strong></li>
<li><strong>&lt;h2&gt;x&lt;/h2&gt;</strong></li>
<li>&lt;h3&gt;x&lt;/h1&gt;</li>
</ol>
<h2 id="替换"><a href="#替换" class="headerlink" title="替换"></a>替换</h2><p>需要用到两个正则表达式。</p>
<p><strong>应用</strong></p>
<p>修改电话号码格式。</p>
<p><strong>文本</strong></p>
<p>313-555-1234</p>
<p><strong>查找正则表达式</strong></p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">(\d&#123;3&#125;)(-)(\d&#123;3&#125;)(-)(\d&#123;4&#125;)</span><br></pre></td></tr></table></figure>
<p><strong>替换正则表达式</strong></p>
<p>在第一个子表达式查找的结果加上 () ，然后加一个空格，在第三个和第五个字表达式查找的结果中间加上 - 进行分隔。</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">($1) $3-$5</span><br></pre></td></tr></table></figure>
<p><strong>结果</strong></p>
<p>(313) 555-1234</p>
<h2 id="大小写转换"><a href="#大小写转换" class="headerlink" title="大小写转换"></a>大小写转换</h2><table>
<thead>
<tr>
<th>元字符</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>\l</td>
<td>把下个字符转换为小写</td>
</tr>
<tr>
<td>\u</td>
<td>把下个字符转换为大写</td>
</tr>
<tr>
<td>\L</td>
<td>把\L 和\E 之间的字符全部转换为小写</td>
</tr>
<tr>
<td>\U</td>
<td>把\U 和\E 之间的字符全部转换为大写</td>
</tr>
<tr>
<td>\E</td>
<td>结束\L 或者\U</td>
</tr>
</tbody>
</table>
<p><strong>应用</strong></p>
<p>把文本的第二个和第三个字符转换为大写。</p>
<p><strong>文本</strong></p>
<p>abcd</p>
<p><strong>查找</strong></p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">(\w)(\w&#123;2&#125;)(\w)</span><br></pre></td></tr></table></figure>
<p><strong>替换</strong></p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$1\U$2\E$3</span><br></pre></td></tr></table></figure>
<p><strong>结果</strong></p>
<p>aBCd</p>
<h1 id="前后查找"><a href="#前后查找" class="headerlink" title="前后查找"></a>前后查找</h1><p>前后查找规定了匹配的内容首尾应该匹配的内容，但是又不包含首尾匹配的内容。向前查找用  <strong>?=</strong>  来定义，它规定了尾部匹配的内容，这个匹配的内容在 ?= 之后定义。所谓向前查找，就是规定了一个匹配的内容，然后以这个内容为尾部向前面查找需要匹配的内容。向后匹配用 ?&lt;= 定义。</p>
<p><strong>应用</strong></p>
<p>查找出邮件地址 @ 字符前面的部分。</p>
<p><strong>正则表达式</strong></p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">\w+(?=@)</span><br></pre></td></tr></table></figure>
<p><strong>结果</strong></p>
<p><strong>abc</strong> @qq.com</p>
<p>对向前和向后查找取非，只要把 = 替换成 ! 即可，比如 (?=) 替换成 (?!) 。取非操作使得匹配那些首尾不符合要求的内容。</p>
<h1 id="嵌入条件"><a href="#嵌入条件" class="headerlink" title="嵌入条件"></a>嵌入条件</h1><h2 id="回溯引用条件"><a href="#回溯引用条件" class="headerlink" title="回溯引用条件"></a>回溯引用条件</h2><p>条件判断为某个子表达式是否匹配，如果匹配则需要继续匹配条件表达式后面的内容。</p>
<p><strong>正则表达式</strong></p>
<p>子表达式 (\() 匹配一个左括号，其后的 ? 表示匹配 0 个或者 1 个。 ?(1) 为条件，当子表达式 1 匹配时条件成立，需要执行 ) 匹配，也就是匹配右括号。</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">(\()?abc(?(1)\))</span><br></pre></td></tr></table></figure>
<p><strong>结果</strong></p>
<ol>
<li><strong>(abc)</strong></li>
<li><strong>abc</strong></li>
<li>(abc</li>
</ol>
<h2 id="前后查找条件"><a href="#前后查找条件" class="headerlink" title="前后查找条件"></a>前后查找条件</h2><p>条件为定义的首尾是否匹配，如果匹配，则继续执行后面的匹配。注意，首尾不包含在匹配的内容中。</p>
<p><strong>正则表达式</strong></p>
<p> ?(?=-) 为前向查找条件，只有在以 - 为前向查找的结尾能匹配 \d{5} ，才继续匹配 -\d{4} 。</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">\d&#123;5&#125;(?(?=-)-\d&#123;4&#125;)</span><br></pre></td></tr></table></figure>
<p><strong>结果</strong></p>
<ol>
<li><strong>11111</strong></li>
<li>22222-</li>
<li><strong>33333-4444</strong></li>
</ol>
<h1 id="参考资料"><a href="#参考资料" class="headerlink" title="参考资料"></a>参考资料</h1><ul>
<li>转载自<a href="https://github.com/CyC2018" target="_blank" rel="noopener">https://github.com/CyC2018</a></li>
</ul>

      
    </div>

    

    
    
    

    <div>
          
            
<div class="my_post_copyright">
  <script src="//cdn.bootcss.com/clipboard.js/1.5.10/clipboard.min.js"></script>

  <!-- JS库 sweetalert 可修改路径 -->
  <script src="https://cdn.bootcss.com/jquery/2.0.0/jquery.min.js"></script>
  <script src="https://unpkg.com/sweetalert/dist/sweetalert.min.js"></script>
  <p><span>本文标题:</span><a href="/2018/03/16/正则表达式（转）/">正则表达式（转）</a></p>
  <p><span>文章作者:</span><a href="/" title="访问 Q.hongtao 的个人博客">Q.hongtao</a></p>
  <p><span>发布时间:</span>2018年03月16日 - 18:03</p>
  <p><span>最后更新:</span>2018年03月28日 - 11:03</p>
  <p><span>原始链接:</span><a href="/2018/03/16/正则表达式（转）/" title="正则表达式（转）">http://7ht.gitee.io/2018/03/16/正则表达式（转）/</a>
    <span class="copy-path"  title="点击复制文章链接"><i class="fa fa-clipboard" data-clipboard-text="http://7ht.gitee.io/2018/03/16/正则表达式（转）/"  aria-label="复制成功！"></i></span>
  </p>
  <p><span>许可协议:</span><i class="fa fa-creative-commons"></i> <a rel="license" href="https://creativecommons.org/licenses/by-nc-nd/4.0/" target="_blank" title="Attribution-NonCommercial-NoDerivatives 4.0 International (CC BY-NC-ND 4.0)">署名-非商业性使用-禁止演绎 4.0 国际</a> 转载请保留原文链接及作者。</p>
</div>
<script>
    var clipboard = new Clipboard('.fa-clipboard');
      $(".fa-clipboard").click(function(){
      clipboard.on('success', function(){
        swal({
          title: "",
          text: '复制成功',
          icon: "success",
          showConfirmButton: true
          });
        });
    });
</script>


          
      </div>

    

    

    
  <div>
  
    

  
</div>
    <footer class="post-footer">
      
        <div class="post-tags">
          
            <a href="/tags/正则/" rel="tag"># 正则</a>
          
        </div>
      

      
      
      

      
        <div class="post-nav">
          <div class="post-nav-next post-nav-item">
            
              <a href="/2018/03/16/SQL基础（转）/" rel="next" title="SQL基础（转）">
                <i class="fa fa-chevron-left"></i> SQL基础（转）
              </a>
            
          </div>

          <span class="post-nav-divider"></span>

          <div class="post-nav-prev post-nav-item">
            
              <a href="/2018/03/16/HTTP基础（转）/" rel="prev" title="HTTP基础（转）">
                HTTP基础（转） <i class="fa fa-chevron-right"></i>
              </a>
            
          </div>
        </div>
      

      
      
    </footer>
  </div>
  
  
  
  </article>



    <div class="post-spread">
      
    </div>
  </div>


          </div>
          

  



        </div>
        
          
  
  <div class="sidebar-toggle">
    <div class="sidebar-toggle-line-wrap">
      <span class="sidebar-toggle-line sidebar-toggle-line-first"></span>
      <span class="sidebar-toggle-line sidebar-toggle-line-middle"></span>
      <span class="sidebar-toggle-line sidebar-toggle-line-last"></span>
    </div>
  </div>

  <aside id="sidebar" class="sidebar">
    
    <div class="sidebar-inner">

      

      
        <ul class="sidebar-nav motion-element">
          <li class="sidebar-nav-toc sidebar-nav-active" data-target="post-toc-wrap">
            文章目录
          </li>
          <li class="sidebar-nav-overview" data-target="site-overview-wrap">
            站点概览
          </li>
        </ul>
      

      <section class="site-overview-wrap sidebar-panel">
        <div class="site-overview">
          <div class="site-author motion-element" itemprop="author" itemscope itemtype="http://schema.org/Person">
            
              <img class="site-author-image" itemprop="image"
                src="/images/head_cat.jpg"
                alt="Q.hongtao" />
            
              <p class="site-author-name" itemprop="name">Q.hongtao</p>
              <p class="site-description motion-element" itemprop="description">没有可怕的深度 就没有美丽的水面</p>
          </div>

          
            <nav class="site-state motion-element">
              
                <div class="site-state-item site-state-posts">
                
                  <a href="/archives">
                
                    <span class="site-state-item-count">34</span>
                    <span class="site-state-item-name">日志</span>
                  </a>
                </div>
              

              
                
                
                <div class="site-state-item site-state-categories">
                  <a href="/categories/index.html">
                    
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                    <span class="site-state-item-count">9</span>
                    <span class="site-state-item-name">分类</span>
                  </a>
                </div>
              

              
                
                
                <div class="site-state-item site-state-tags">
                  <a href="/tags/index.html">
                    
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                    <span class="site-state-item-count">42</span>
                    <span class="site-state-item-name">标签</span>
                  </a>
                </div>
              
            </nav>
          

          

          
            <div class="links-of-author motion-element">
              
                <span class="links-of-author-item">
                  <a href="https://github.com/ht-dep" target="_blank" title="GitHub"><i class="fa fa-fw fa-github"></i>GitHub</a>
                  
                </span>
              
                <span class="links-of-author-item">
                  <a href="mailto:15662728521@163.com" target="_blank" title="E-Mail"><i class="fa fa-fw fa-envelope"></i>E-Mail</a>
                  
                </span>
              
            </div>
          

          
          

          
          

          
            
          
          

        </div>
      </section>

      
      <!--noindex-->
        <section class="post-toc-wrap motion-element sidebar-panel sidebar-panel-active">
          <div class="post-toc">

            
              
            

            
              <div class="post-toc-content"><ol class="nav"><li class="nav-item nav-level-1"><a class="nav-link" href="#概述"><span class="nav-number">1.</span> <span class="nav-text">概述</span></a></li><li class="nav-item nav-level-1"><a class="nav-link" href="#匹配单个字符"><span class="nav-number">2.</span> <span class="nav-text">匹配单个字符</span></a></li><li class="nav-item nav-level-1"><a class="nav-link" href="#匹配一组字符"><span class="nav-number">3.</span> <span class="nav-text">匹配一组字符</span></a></li><li class="nav-item nav-level-1"><a class="nav-link" href="#使用元字符"><span class="nav-number">4.</span> <span class="nav-text">使用元字符</span></a><ol class="nav-child"><li class="nav-item nav-level-2"><a class="nav-link" href="#匹配空白字符"><span class="nav-number">4.1.</span> <span class="nav-text">匹配空白字符</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#匹配特定的字符类别"><span class="nav-number">4.2.</span> <span class="nav-text">匹配特定的字符类别</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#使用-POSIX-字符类"><span class="nav-number">4.3.</span> <span class="nav-text">使用 POSIX 字符类</span></a></li></ol></li><li class="nav-item nav-level-1"><a class="nav-link" href="#重复匹配"><span class="nav-number">5.</span> <span class="nav-text">重复匹配</span></a></li><li class="nav-item nav-level-1"><a class="nav-link" href="#位置匹配"><span class="nav-number">6.</span> <span class="nav-text">位置匹配</span></a><ol class="nav-child"><li class="nav-item nav-level-2"><a class="nav-link" href="#单词边界"><span class="nav-number">6.1.</span> <span class="nav-text">单词边界</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#字符串边界"><span class="nav-number">6.2.</span> <span class="nav-text">字符串边界</span></a></li></ol></li><li class="nav-item nav-level-1"><a class="nav-link" href="#使用子表达式"><span class="nav-number">7.</span> <span class="nav-text">使用子表达式</span></a></li><li class="nav-item nav-level-1"><a class="nav-link" href="#回溯引用"><span class="nav-number">8.</span> <span class="nav-text">回溯引用</span></a><ol class="nav-child"><li class="nav-item nav-level-2"><a class="nav-link" href="#替换"><span class="nav-number">8.1.</span> <span class="nav-text">替换</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#大小写转换"><span class="nav-number">8.2.</span> <span class="nav-text">大小写转换</span></a></li></ol></li><li class="nav-item nav-level-1"><a class="nav-link" href="#前后查找"><span class="nav-number">9.</span> <span class="nav-text">前后查找</span></a></li><li class="nav-item nav-level-1"><a class="nav-link" href="#嵌入条件"><span class="nav-number">10.</span> <span class="nav-text">嵌入条件</span></a><ol class="nav-child"><li class="nav-item nav-level-2"><a class="nav-link" href="#回溯引用条件"><span class="nav-number">10.1.</span> <span class="nav-text">回溯引用条件</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#前后查找条件"><span class="nav-number">10.2.</span> <span class="nav-text">前后查找条件</span></a></li></ol></li><li class="nav-item nav-level-1"><a class="nav-link" href="#参考资料"><span class="nav-number">11.</span> <span class="nav-text">参考资料</span></a></li></ol></div>
            

          </div>
        </section>
      <!--/noindex-->
      

      

    </div>
  </aside>


        
      </div>
    </main>

    <footer id="footer" class="footer">
      <div class="footer-inner">
        <script async src="https://dn-lbstatics.qbox.me/busuanzi/2.3/busuanzi.pure.mini.js"></script>
<div class="copyright">&copy; 2017 &mdash; <span itemprop="copyrightYear">2019</span>
  <span class="with-love">
    <i class="fa fa-user"></i>
  </span>
  <span class="author" itemprop="copyrightHolder">ht-dep</span>

  

  
</div>



















        
<div class="busuanzi-count">
  <script async src="https://dn-lbstatics.qbox.me/busuanzi/2.3/busuanzi.pure.mini.js"></script>

  
    <span class="site-uv" title="总访客量">
      <i class="fa fa-user"></i>
      <span class="busuanzi-value" id="busuanzi_value_site_uv"></span>
    </span>
  

  
    <span class="site-pv" title="总访问量">
      <i class="fa fa-eye"></i>
      <span class="busuanzi-value" id="busuanzi_value_site_pv"></span>
    </span>
  
</div>









        
      </div>
    </footer>

    
      <div class="back-to-top">
        <i class="fa fa-arrow-up"></i>
        
      </div>
    

    

  </div>

  

<script type="text/javascript">
  if (Object.prototype.toString.call(window.Promise) !== '[object Function]') {
    window.Promise = null;
  }
</script>


























  
  
    <script type="text/javascript" src="/lib/jquery/index.js?v=2.1.3"></script>
  

  
  
    <script type="text/javascript" src="/lib/velocity/velocity.min.js?v=1.2.1"></script>
  

  
  
    <script type="text/javascript" src="/lib/velocity/velocity.ui.min.js?v=1.2.1"></script>
  


  


  <script type="text/javascript" src="/js/src/utils.js?v=6.0.6"></script>

  <script type="text/javascript" src="/js/src/motion.js?v=6.0.6"></script>



  
  


  <script type="text/javascript" src="/js/src/affix.js?v=6.0.6"></script>

  <script type="text/javascript" src="/js/src/schemes/pisces.js?v=6.0.6"></script>



  
  <script type="text/javascript" src="/js/src/scrollspy.js?v=6.0.6"></script>
<script type="text/javascript" src="/js/src/post-details.js?v=6.0.6"></script>



  


  <script type="text/javascript" src="/js/src/bootstrap.js?v=6.0.6"></script>



  



	





  





  










  





  

  

  

  

  
  

  

  

  

  


<script src="/live2dw/lib/L2Dwidget.min.js?0c58a1486de42ac6cc1c59c7d98ae887"></script><script>L2Dwidget.init({"display":{"position":"right","width":100,"height":150},"model":{"jsonPath":"/live2dw/assets/tororo.model.json"},"mobile":{"show":false,"scale":0.5},"react":{"opacityDefault":1,"opacityOnHover":0.2}});</script></body>
</html>
